www.gusucode.com > VC++仿XP免费Prof UIS界面库-源码程序 > VC++仿XP免费Prof UIS界面库-源码程序/code/Samples/MthOutput/LogCtrl.cpp

    //Download by http://www.NewXing.com
// LogCtrl.cpp : implementation of the CLogCtrl class
//

#include "stdafx.h"
#include "MthOutput.h"
#include "LogCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLogCtrl

CLogCtrl::CLogCtrl()
	: m_dwHelperThreadID(0)
	, m_nLineCountMax( 400 )
{
}

CLogCtrl::~CLogCtrl()
{
}


BEGIN_MESSAGE_MAP(CLogCtrl,CRichEditCtrl)
	//{{AFX_MSG_MAP(CLogCtrl)
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
	//}}AFX_MSG_MAP
	ON_MESSAGE( WM_USR_WRITE_LOG_TEXT, On_WM_USR_WRITE_LOG_TEXT )
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CLogCtrl message handlers

BOOL CLogCtrl::PreCreateWindow(CREATESTRUCT& cs) 
{
	if( ! CRichEditCtrl :: PreCreateWindow(cs) )
		return FALSE;
	cs.style &= ~WS_BORDER;
	return TRUE;
}

int CLogCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if( CRichEditCtrl :: OnCreate(lpCreateStruct) == -1 )
		return -1;
	_InitRichEditProps();
	return 0;
}

void CLogCtrl::OnTimer(UINT nIDEvent) 
{
	if( nIDEvent == ID_TIMER_DELAYED_UPDATE )
	{
		if( _CanUpdate() )
		{
			KillTimer( ID_TIMER_DELAYED_UPDATE );
			Invalidate();
			UpdateWindow();
		}
		return;
	} // if( nIDEvent == ID_TIMER_DELAYED_UPDATE )
	
	CRichEditCtrl::OnTimer(nIDEvent);
}

void CLogCtrl::OnEditCopy() 
{
CHARRANGE _cr;
	GetSel( _cr );
	if( _cr.cpMin != _cr.cpMax )
		CRichEditCtrl::Copy();
}

void CLogCtrl::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
CHARRANGE _cr;
	GetSel( _cr );
	pCmdUI->Enable(
		( _cr.cpMin != _cr.cpMax ) ? TRUE : FALSE
		);
}

LRESULT CLogCtrl::On_WM_USR_WRITE_LOG_TEXT( WPARAM wParam, LPARAM lParam )
{
	ASSERT_VALID( this );
	wParam;
_MthMessageDataFor_WM_USR_WRITE_LOG_TEXT & _data =
	_MthMessageDataFor_WM_USR_WRITE_LOG_TEXT::FromLPARAM( lParam );
	WriteText(
		_data.m_bBold,
		_data.m_clrText,
		_data.m_sText
		);
	return 0L;
}

void CLogCtrl::_InitRichEditProps()
{
PARAFORMAT _pf;
	_pf.cbSize = sizeof(PARAFORMAT);
	_pf.dwMask = PFM_TABSTOPS ;
	_pf.cTabCount = MAX_TAB_STOPS;
	for( int nTabIdx = 0 ; nTabIdx < _pf.cTabCount; nTabIdx++ )
		_pf.rgxTabs[nTabIdx] = (nTabIdx + 1) * 1440/5;
	CRichEditCtrl::SetParaFormat( _pf );

CHARFORMAT _cf;
	memset( &_cf, 0, sizeof(CHARFORMAT) );
	_cf.cbSize = sizeof(_cf);
	_cf.dwEffects = 0; // CFE_PROTECTED; 
	_cf.dwMask =
		CFM_FACE|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT
		|CFM_SIZE|CFM_CHARSET|CFM_PROTECTED|CFM_COLOR;
	_cf.yHeight = 160;
	_cf.bCharSet = DEFAULT_CHARSET;
#if _MFC_VER < 0x700
	strcpy( _cf.szFaceName, "Courier New" ); // <-- TO FIX <--
#else
	_tcscpy( _cf.szFaceName, _T("Courier New") );
#endif
	_cf.crTextColor = RGB(0,0,0);
	CRichEditCtrl::SetDefaultCharFormat( _cf );
	CRichEditCtrl::SetWordCharFormat( _cf );
	
	CRichEditCtrl::SetBackgroundColor( FALSE, RGB(255,255,255) );
	
	CRichEditCtrl::SetSel( -1, -1 );
}

bool CLogCtrl::_CanUpdate()
{
	if( CExtControlBar::FindHwndNotSafeForMutualPaint(this) != NULL )
		return false;
	if( CExtPopupMenuWnd::g_bMenuWithShadows )
	{
		if( CExtToolControlBar::g_bMenuTracking )
			return false;
		if( CExtPopupMenuWnd::IsMenuTracking() )
			return false;
	} // if( CExtPopupMenuWnd::g_bMenuWithShadows )
	return true;
}

void CLogCtrl::WriteText(
	bool bBold,
	COLORREF clrText,
	LPCTSTR sText
	)
{
	ASSERT( this != NULL );
	if( m_dwHelperThreadID != ::GetCurrentThreadId() )
	{
		_MthMessageDataFor_WM_USR_WRITE_LOG_TEXT _data(
			bBold,
			clrText,
			sText
			);
		SendMessage(
			WM_USR_WRITE_LOG_TEXT,
			WPARAM(0),
			_data
			);
		return;
	}
	
	ASSERT_VALID( this );
	if(		sText == NULL
		||	_tcslen( sText ) == 0
		)
		return;

bool bCanUpdate = _CanUpdate();
	SetRedraw( FALSE );

int nFirstLine1 = CRichEditCtrl::GetFirstVisibleLine();
CHARRANGE crOld1, crOld2;
	CRichEditCtrl::GetSel( crOld1 );
	CRichEditCtrl::SetSel( -1, -1 );
	CRichEditCtrl::GetSel( crOld2 );
bool bResetSel = true;
	if(		crOld1.cpMin == crOld2.cpMin
		&&	crOld1.cpMax == crOld2.cpMax
		)
		bResetSel = false;
	CRichEditCtrl::ReplaceSel( sText );

CHARFORMAT _cf;
	_cf.cbSize = sizeof(CHARFORMAT);
	_cf.dwMask = CFM_COLOR|CFM_BOLD;
	_cf.dwEffects = bBold ? CFE_BOLD : 0;
	_cf.crTextColor = clrText;
	CRichEditCtrl::SetSel( crOld2.cpMax, -1 );
	CRichEditCtrl::SetSelectionCharFormat( _cf );

	if( bResetSel )
	{
		CRichEditCtrl::SetSel( crOld1 );
		int nFirstLine2 = CRichEditCtrl::GetFirstVisibleLine();
		if( nFirstLine1 != nFirstLine2 )
			LineScroll( nFirstLine1-nFirstLine2, 0) ;
	} // if( bResetSel )

	if( m_nLineCountMax > 0 )
	{
		int nLineCount = CRichEditCtrl::GetLineCount();
		if( nLineCount > m_nLineCountMax )
		{
			int nEndRemovePos =
				CRichEditCtrl::LineIndex(
					nLineCount > m_nLineCountMax 
					);
			CHARRANGE crRestore;
			GetSel( crRestore );
			crRestore.cpMin -= nEndRemovePos;
			crRestore.cpMax -= nEndRemovePos;
			SetSel( 0, nEndRemovePos );
			CRichEditCtrl::ReplaceSel( _T("") );
			SetSel( crRestore );
		}
	} // if( m_nLineCountMax > 0 )

	if( !bResetSel )
		CRichEditCtrl::SetSel( -1, -1 );

	SetRedraw( TRUE );
	if( bCanUpdate )
		Invalidate();
	else
		SetTimer(
			ID_TIMER_DELAYED_UPDATE,
			ELAPSE_TIMER_DELAYED_UPDATE,
			NULL
			);
}

/////////////////////////////////////////////////////////////////////////////
// CDemoEventSourceWnd

static struct
{
	bool m_bBold;
	COLORREF m_clrText;
	LPCTSTR m_sLine;
} arrDemoOutputLines[] =
{
	{ false, RGB(128,128,128), _T("Deleting intermediate files and output files for project \'profuisdll - Win32 MBCS Debug\'.\n") },
	{ false, RGB(128,128,128), _T("Deleting intermediate files and output files for project \'profuisdll - Win32 MBCS Release\'.\n") },
	{ true,  RGB(0,0,0), _T("--------------------Configuration: profuisdll - Win32 MBCS Debug--------------------\n") },
	{ false, RGB(128,0,0), _T("Compiling resources...\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("StdAfx.cpp\n") },
	{ false, RGB(0,0,128), _T("   Automatically linking with WinMM library\n") },
	{ false, RGB(0,0,128), _T("      (Windows Multimedia System)\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("exdlgbase.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtBtnOnFlat.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtButton.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtCmdManager.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtColorCtrl.cpp\n") },
	{ false, RGB(0,0,128), _T("   Automatically linking with version.lib\n") },
	{ false, RGB(0,0,128), _T("      (Version info support)\n") },
	{ false, RGB(0,0,0), _T("ExtColorDlg.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtComboBox.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtContentExpandWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("extcontrolbar.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtControlBarTabbedFeatures.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtDockBar.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtEdit.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtHook.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtMenuControlBar.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtMiniDockFrameWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtMouseCaptureSink.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtPageContainerWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtPaintManager.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtPopupMenuWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtResizableDialog.cpp\n") },
	{ false, RGB(128,0,0), _T("Generating Code...\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("ExtShortcutListWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtTabWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtToolBoxWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtToolControlBar.cpp\n") },
	{ false, RGB(0,0,0), _T("profuisdll.cpp\n") },
	{ false, RGB(128,0,0), _T("Generating Code...\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("ExtStatusControlBar.cpp\n") },
	{ true,  RGB(128,128,0), _T("Linking...\n") },
	{ false, RGB(128,0,128), _T("   Creating library ../Bin_600/ProfUIS223md.lib and object ../Bin_600/ProfUIS223md.exp\n") },
	{ false, RGB(0,0,0), _T("\n") },
	{ true,  RGB(0,128,0), _T("ProfUIS223md.dll - 0 error(s), 0 warning(s)\n") },
	{ false, RGB(0,0,0), _T("\n") },
	{ true,  RGB(0,0,0), _T("--------------------Configuration: profuisdll - Win32 MBCS Release--------------------\n") },
	{ false, RGB(128,0,0), _T("Compiling resources...\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("StdAfx.cpp\n") },
	{ false, RGB(0,0,128), _T("   Automatically linking with WinMM library\n") },
	{ false, RGB(0,0,128), _T("      (Windows Multimedia System)\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("exdlgbase.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtBtnOnFlat.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtButton.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtCmdManager.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtColorCtrl.cpp\n") },
	{ false, RGB(0,0,128), _T("   Automatically linking with version.lib\n") },
	{ false, RGB(0,0,128), _T("      (Version info support)\n") },
	{ false, RGB(0,0,0), _T("ExtColorDlg.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtComboBox.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtContentExpandWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("extcontrolbar.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtControlBarTabbedFeatures.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtDockBar.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtEdit.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtHook.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtMenuControlBar.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtMiniDockFrameWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtMouseCaptureSink.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtPageContainerWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtPaintManager.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtPopupMenuWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtResizableDialog.cpp\n") },
	{ false, RGB(128,0,0), _T("Generating Code...\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("ExtShortcutListWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtTabWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtToolBoxWnd.cpp\n") },
	{ false, RGB(0,0,0), _T("ExtToolControlBar.cpp\n") },
	{ false, RGB(0,0,0), _T("profuisdll.cpp\n") },
	{ false, RGB(128,0,0), _T("Generating Code...\n") },
	{ false, RGB(128,0,0), _T("Compiling...\n") },
	{ false, RGB(0,0,0), _T("ExtStatusControlBar.cpp\n") },
	{ true,  RGB(128,128,0), _T("Linking...\n") },
	{ false, RGB(128,0,128), _T("   Creating library ../Bin_600/ProfUIS223m.lib and object ../Bin_600/ProfUIS223m.exp\n") },
	{ false, RGB(0,0,0), _T("\n") },
	{ true,  RGB(0,128,0), _T("ProfUIS223m.dll - 0 error(s), 0 warning(s)\n") },
	{ false, RGB(0,0,0), _T("\n") },
};

CDemoEventSourceWnd::CDemoEventSourceWnd()
	: m_nDemoOutputLineIndex( 0 )
	, m_pWndLogCtrl( NULL )
{
}

CDemoEventSourceWnd::~CDemoEventSourceWnd()
{
}


BEGIN_MESSAGE_MAP(CDemoEventSourceWnd,CWnd)
	//{{AFX_MSG_MAP(CDemoEventSourceWnd)
	ON_WM_CREATE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CDemoEventSourceWnd message handlers

int CDemoEventSourceWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	SetTimer(
		ID_TIMER_EVENT_SOURCE,
		ELAPSE_TIMER_EVENT_SOURCE,
		NULL
		);
	
	return 0;
}

void CDemoEventSourceWnd::OnTimer(UINT nIDEvent) 
{
	if( nIDEvent == ID_TIMER_EVENT_SOURCE )
	{
		if( m_nDemoOutputLineIndex >=
				sizeof(arrDemoOutputLines)/sizeof(arrDemoOutputLines[0])
			)
			m_nDemoOutputLineIndex = 0;
		ASSERT( m_pWndLogCtrl != NULL );
		if(		m_pWndLogCtrl->GetSafeHwnd() == NULL
			|| (! ::IsWindow(m_pWndLogCtrl->GetSafeHwnd()) )
			)
		{
			KillTimer( ID_TIMER_EVENT_SOURCE );
			return;
		}
		m_pWndLogCtrl->WriteText(
			arrDemoOutputLines[m_nDemoOutputLineIndex].m_bBold,
			arrDemoOutputLines[m_nDemoOutputLineIndex].m_clrText,
			arrDemoOutputLines[m_nDemoOutputLineIndex].m_sLine
			);
		m_nDemoOutputLineIndex++;
		return;
	} // if( nIDEvent == ID_TIMER_EVENT_SOURCE )
	
	if( nIDEvent == ID_TIMER_DELAYED_DESTROY )
	{
		KillTimer( ID_TIMER_DELAYED_DESTROY );
		DestroyWindow();
		return;
	} // if( nIDEvent == ID_TIMER_DELAYED_DESTROY )

	CWnd::OnTimer(nIDEvent);
}